using System;
using System.Collections.Generic;
using System.Text;

using student_factory.Metier;

using System.Data;
using System.Data.SqlClient;

namespace student_factory.DAO
{
    class UtilisateurDAO
    {
        //private static String connection = "data source=ATHLONX2\\SQLEXPRESS;initial catalog=STUDENTS_FACTORY;Integrated Security=True";
        private static String connection = "data source=localhost;initial catalog=STUDENTS_FACTORY;User ID=sa;Password=";

        public static IList<Utilisateur> getAll()
        {
            SqlConnection connexion = null;
            SqlDataReader reader = null;
            IList<Utilisateur> utilisateurs = new List<Utilisateur>();

            try
            {
                connexion = new SqlConnection();
                connexion.ConnectionString = connection;

                connexion.Open();

                SqlCommand commande = connexion.CreateCommand();
                commande.CommandText = "SELECT * from UTILISATEURS";

                reader = commande.ExecuteReader();

                while (reader.Read())
                {
                    Utilisateur util = new Utilisateur(false);
                    util.Id_u = reader["ID_U"].ToString();
                    util.Id_d = reader["ID_D"].ToString();
                    util.Uti_login = reader["UTI_LOGIN"].ToString();
                    util.Uti_password =  reader["UTI_PASSWORD"].ToString();

                    utilisateurs.Add(util);
                }
            }
            catch (SqlException e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                if (reader != null)
                    reader.Close();

                if (connexion != null)
                    connexion.Close();
            }

            return utilisateurs;
        }

        public static IList<Utilisateur> getAllWithRight()
        {
            SqlConnection connexion = null;
            SqlDataReader reader = null;
            IList<Utilisateur> utilisateurs = new List<Utilisateur>();

            try
            {
                connexion = new SqlConnection();
                connexion.ConnectionString = connection;

                connexion.Open();

                SqlCommand commande = connexion.CreateCommand();
                commande.CommandText = "SELECT UTILISATEURS.ID_U, UTILISATEURS.UTI_LOGIN, UTILISATEURS.UTI_PASSWORD, DROITS.DRO_DESCRIPTION " +
                    "FROM UTILISATEURS INNER JOIN DROITS ON UTILISATEURS.ID_D = DROITS.ID_D ";

                reader = commande.ExecuteReader();

                while (reader.Read())
                {
                    Utilisateur util = new Utilisateur(false);
                    util.Id_u = reader["ID_U"].ToString();
                    util.Uti_login = reader["UTI_LOGIN"].ToString();
                    util.Uti_password = reader["UTI_PASSWORD"].ToString();
                    util.Droits = reader["DRO_DESCRIPTION"].ToString();

                    utilisateurs.Add(util);
                }
            }
            catch (SqlException e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                if (reader != null)
                    reader.Close();

                if (connexion != null)
                    connexion.Close();
            }

            return utilisateurs;
        }

        public static Utilisateur getUser(String user)
        {
            SqlConnection connexion = null;
            SqlDataReader reader = null;
            Utilisateur util = null;

            try
            {
                connexion = new SqlConnection();
                connexion.ConnectionString = connection;
                connexion.Open();

                SqlCommand commande = connexion.CreateCommand();
                commande.CommandText = "SELECT * from UTILISATEURS WHERE UTI_LOGIN = " + user;

                reader = commande.ExecuteReader();

                while (reader.Read())
                {
                    util = new Utilisateur(false);

                    util.Id_d = reader["ID_U"].ToString();
                    util.Id_u = reader["ID_D"].ToString();
                    util.Uti_login = reader["UTI_LOGIN"].ToString();
                    util.Uti_password = reader["UTI_PASSWORD"].ToString();
                }
                
            }
            catch (SqlException e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                if (reader != null)
                    reader.Close();

                if (connexion != null)
                    connexion.Close();
            }

            return util;
        }

        public static Utilisateur getUserById(String id)
        {
            SqlConnection connexion = null;
            SqlDataReader reader = null;
            Utilisateur util = null;

            try
            {
                connexion = new SqlConnection();
                connexion.ConnectionString = connection;
                connexion.Open();

                SqlCommand commande = connexion.CreateCommand();
                commande.CommandText = "SELECT UTILISATEURS.ID_U, UTILISATEURS.UTI_LOGIN, UTILISATEURS.UTI_PASSWORD, DROITS.DRO_DESCRIPTION " +
                    "FROM UTILISATEURS INNER JOIN DROITS ON UTILISATEURS.ID_D = DROITS.ID_D WHERE ID_U ='" + id + "'";

                reader = commande.ExecuteReader();

                while (reader.Read())
                {
                    util = new Utilisateur(false);

                    util.Id_u = reader["ID_U"].ToString();
                    util.Uti_login = reader["UTI_LOGIN"].ToString();
                    util.Uti_password = reader["UTI_PASSWORD"].ToString();
                    util.Droits = reader["DRO_DESCRIPTION"].ToString();
                }

            }
            catch (SqlException e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                if (reader != null)
                    reader.Close();

                if (connexion != null)
                    connexion.Close();
            }

            return util;
        }

        public static bool checkPassword(String user, String password)
        {
            SqlConnection connexion = null;
            SqlDataReader reader = null;
            String mdp = null;
            try
            {
                connexion = new SqlConnection();
                connexion.ConnectionString = connection;

                connexion.Open();

                SqlCommand commande = connexion.CreateCommand();
                commande.CommandText = "SELECT UTI_PASSWORD from UTILISATEURS WHERE UTI_LOGIN='" + user + "'";

                reader = commande.ExecuteReader();

                while (reader.Read())
                {
                    mdp = reader["UTI_PASSWORD"].ToString();
                }
            }
            catch (SqlException e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                if (reader != null)
                    reader.Close();

                if (connexion != null)
                    connexion.Close();
            }

            if (mdp == null || password == null)
                return false;

            if (mdp.Equals(password))
                return true;
            else
                return false;
        }

        public static int getRight(string user, string mdp)
        {
            SqlConnection connexion = null;
            SqlDataReader reader = null;
            String droits = null;
            try
            {
                connexion = new SqlConnection();
                connexion.ConnectionString = connection;

                connexion.Open();

                SqlCommand commande = connexion.CreateCommand();
                commande.CommandText = "SELECT UTILISATEURS.UTI_LOGIN, DROITS.DRO_DESCRIPTION " + 
                    "FROM UTILISATEURS INNER JOIN DROITS ON UTILISATEURS.ID_D = DROITS.ID_D " + 
                    "WHERE (UTILISATEURS.UTI_LOGIN = '" + user + "')";

                reader = commande.ExecuteReader();

                while (reader.Read())
                {
                    droits = reader["DRO_DESCRIPTION"].ToString();
                }
            }
            catch (SqlException e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                if (reader != null)
                    reader.Close();

                if (connexion != null)
                    connexion.Close();
            }

            return Utilisateur.getDroits(droits);
        }

        public static bool DeleteUserById(String id)
        {
            SqlConnection connexion = null;
            bool retour = true;

            try
            {
                connexion = new SqlConnection();
                connexion.ConnectionString = connection;
                connexion.Open();

                SqlCommand commande = connexion.CreateCommand();
                commande.CommandText = "DELETE FROM UTILISATEURS WHERE ID_U ='" + id + "'";

                int modif = commande.ExecuteNonQuery();

                if (modif == 0)
                    retour = false;
             
            }
            catch (SqlException e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                if (connexion != null)
                    connexion.Close();
            }

            return retour;

        }

        public static bool addUser(string login, string password, string droits)
        {
            SqlConnection connexion = null;
            bool retour = true;

            try
            {
                connexion = new SqlConnection();
                connexion.ConnectionString = connection;
                connexion.Open();

                SqlCommand commande = connexion.CreateCommand();
                commande.CommandText = "INSERT INTO UTILISATEURS (ID_D, UTI_LOGIN, UTI_PASSWORD)" +
                    "select ID_D, '" + login + "', '" + password +
                    "' FROM DROITS WHERE DRO_DESCRIPTION LIKE '" + droits + "'";

                int modif = commande.ExecuteNonQuery();

                if (modif == 0)
                    retour = false;

            }
            catch (SqlException e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                if (connexion != null)
                    connexion.Close();
            }

            return retour;
        }

        public static bool modifyUser(string id, string login, string password, string droits)
        {
            SqlConnection connexion = null;
            bool retour = true;

            try
            {
                connexion = new SqlConnection();
                connexion.ConnectionString = connection;
                connexion.Open();

                SqlCommand commande = connexion.CreateCommand();
                commande.CommandText = "UPDATE UTILISATEURS SET UTI_LOGIN = '" + login + "', UTI_PASSWORD = '" + password +
                    "', ID_D = (select ID_D FROM DROITS WHERE DRO_DESCRIPTION LIKE '" + droits + "') WHERE ID_U = '" +
                    id + "'";

                int modif = commande.ExecuteNonQuery();

                if (modif == 0)
                    retour = false;

            }
            catch (SqlException e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                if (connexion != null)
                    connexion.Close();
            }

            return retour;
        }

        
    }
}
